/**
 * dart 中的函数
 *  dart 中的函数是一个 Function 类型的对象，所以函数也可以赋值给一个变量，
 *  也可以作为参数传递进另一个函数中。
 * 
 *  函数定义（标准写法）:
 *  返回值类型 函数名(参数类型 参数名, 参数类型 参数名, ...) {
 *      函数体;
 *      return 返回值;
 *  }
 * 
 *  简写：返回值的类型可以省略
 * 
 *  箭头函数
 *  var 函数名 = (参数类型 参数, ...) => {
 *      函数体;
 *      return 返回值;
 *  }
 *  
 *  简写：
 *    形参类型可以省略，如果省略，默认为dynamic类型
 *    var 函数名 = (参数1, 参数2, 参数n) => { 函数体... }
 *    如果函数体只有一句话，{} 和 return 可以省略
 *    var 函数名 = (参数1, 参数2, 参数n) => 函数体;
 * 
 *  函数的可选参数：
 *    定义函数时，不确定参数有没有时，就可用可选参数
 *    函数定义：
 *      函数名(形参1, 形参2, [可选参数1=默认值1, 可选形参2=默认值2...]) {
 *         函数体;
 *      }
 *    函数调用:
 *      函数名(实参值1, 实参值2, 实参值3, ...);
 *      参数传值时，实参会按照顺序先传给固定参数，超出固定参数个数的实参值会传给可选形参
 *      如果某个可选形参没接到实参值，则使用默认值，如果没有指定默认值，则实参默认值为 null
 *    
 *  函数的命名参数：
 * 
 *    当多个实参值不确定有没有，但是又要求实参值必须传给对应的形参变量时
 *    命名参数函数定义：
 *      var 函数名 = ({形参1=默认值1, 形参2=默认值2, ...}) => {...}
 *    命名函数调用：
 *      函数名(形参1: 实参值1, 形参2: 实参值2, ...)
 *      调用时，相同形参名的实参值会传递给函数中同名的形参。
 *      调用时，实参值的个数，不一定与函数定义式的形参个数一致。
 *      调用时，如果对应的形参没有给对应的实参赋值，那么会使用函数定义是的默认值；
 *        如果函数值没有给定默认值，则会赋值为 null
 *  
 *  函数闭包：
 * 
 *    只要希望一个变量值既可以反复使用，又不会被别的程序篡改，就可以使用闭包
 *    如何实现闭包：
 *      1、外层函数包裹要保护的变量和内存函数
 *      2、外层函数将内层函数返回到外部
 *      3、想用内层函数的人，可以调用外层函数，用变量接住外层函数返回的内层函数对象
 * 
 *    定义闭包函数：
 * 
 *    外层函数() {
 *      var 受保护的变量 = 值;
 *      return () {
 *        ...
 *      }
 *    }
 * 
 *    闭包函数调用：
 *      var 外部变量 = 外层函数();
 *      结果：外部变量获得了外层函数返回的内层函数对象，反复调用内层函数，就可以反复访问
 *          外层函数的局部变量，但是外界无法篡改外层函数的局部变量
 */

void main() {
  
}
